package utildb;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class Transaction {
	static String stipobd = Propiedades.getString("tipobd");
	static int tipobd = Integer.parseInt(stipobd);
	static String driverName = "";
	static String url = "";
	static String user = "";
	static String clave = "";
	static String ubicacionBaseDatos = "";
        
	static String msg01 = Propiedades.getString("msg01");
	static String msg02 = Propiedades.getString("msg02");
	static String msg03 = Propiedades.getString("msg03");
	
	private Connection con = null;

	public Transaction() {
        }

	static void getValueProperties() {
		switch (tipobd) {
			case 1:		
				driverName = Propiedades.getString("ora_driver");
				url = Propiedades.getString("ora_url");
				user = Propiedades.getString("ora_user");
				clave = Propiedades.getString("ora_clave");
				break;
			case 2:
				driverName = Propiedades.getString("db_driver");
				ubicacionBaseDatos = Propiedades.getString("db_BaseDatos");
                                url = Propiedades.getString("db_url") + ":" + ubicacionBaseDatos;
				break;
		    case 3:
		            driverName = Propiedades.getString("mdb_driver");
		            ubicacionBaseDatos = Propiedades.getString("mdb_BaseDatos");
		            url = Propiedades.getString("mdb_url") + ":" + ubicacionBaseDatos;
		            break;
		    case 4:
		            driverName = Propiedades.getString("mysql_driver");
		            ubicacionBaseDatos = Propiedades.getString("mysql_BaseDatos");
		            url = Propiedades.getString("mysql_url");
			    user = Propiedades.getString("mysql_user");
                	    clave = Propiedades.getString("mysql_clave");
		            break;
		}
	}

	static public Connection getJDBCConnection() throws TransactionException {
		try {
			//localizar el driver y llevarlo a memoria
			Class.forName(driverName).newInstance();
		} catch (Exception e) {
			//este error ocurre si no se encuentra el driver
			throw new TransactionException( msg01 );
		}
		Connection connection = null;
		switch (tipobd) {
			case 1:
				try {
					//solicitar la conexi�n
					connection = DriverManager.getConnection(url, user, clave);
				} catch (SQLException e1) {
					//si no pudo conectarse
					throw new TransactionException(e1);
				}
				break;
			case 2:
				try {
					//solicitar la conexi�n
					connection = DriverManager.getConnection(url);
				} catch (SQLException e1) {
					//si no pudo conectarse
					throw new TransactionException(e1);
				}
				break;
                        case 3:
                                try {
                                        //solicitar la conexi�n
                                        connection = DriverManager.getConnection(url);
                                } catch (SQLException e1) {
                                        //si no pudo conectarse
                                        throw new TransactionException(e1);
                                }
                                break;
                        case 4:
                                try {
                                        //solicitar la conexi�n
                                        connection = DriverManager.getConnection(url, "root", "admin");
                                } catch (SQLException e1) {
                                        //si no pudo conectarse
                                        throw new TransactionException(e1);
                                }
                                break;
		}
		return connection;
	}

	public Connection getConnection() throws TransactionException {
		// Cargar los valores de la propiedad db.properties
		getValueProperties();
		//patr�n SINGLETOM
		if (con == null) {
			con = getJDBCConnection();
			try {
				con.setAutoCommit(false);
			} catch (SQLException e) {
				throw new TransactionException(e);
			}
		}
		return con;
	}

	public void commit() throws TransactionException {
		try {
			if (con != null)
				con.commit();
		} catch (SQLException e) {
			throw new TransactionException(e);
		}

	}

	public void rollback() {
		try {
			if (con != null)
				con.rollback();
		} catch (SQLException ignored) {
			ignored.printStackTrace();
		}
	}

	public void close() {
		try {
			if (con != null) {
				con.close();
				con = null;
			}
		} catch (SQLException ignored) {
			ignored.printStackTrace();
		}
	}

    public int getTipobd() {
        return tipobd;
    }
    
}
